package dailynewsreader.controller;

import dailynewsreader.model.RSSFeed;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;

/**
 * Feliratkozáskezelő
 *
 * @author Zen
 */
public class SubscriptionManager implements ISearchableFeeds {

    /**
     * A feliratkozásoknak megfelelő parse-olt feed-ek
     */
    private ArrayList<RSSFeed> feeds;

    /**
     * Konstruktor
     */
    public SubscriptionManager() {
        this.feeds = new ArrayList<RSSFeed>();
    }

    /**
     * Hozzáad egy feliratkozást URL alapján
     *
     * @param link A feed URL-je
     * @throws Ha hiba történt a feldolgozás során, akkor eldobjuk, és a
     * hívásnál kezeljük le
     */
    public void addSubscription(String link) throws IOException {
        URL url = new URL(link);
        RSSFeed feed = new RSSFeed(url);
        feed = RSSParser.parseRSSFeedFromURL(feed);
        if (!this.feeds.contains(feed)) {           
            this.feeds.add(feed);
        }
    }

    /**
     * Hozzáad egy feliratkozást feed objektum alapján
     * 
     * @param feed A feed objektum
     */
    public void addSubscription(RSSFeed feed) {
        if (!this.feeds.contains(feed)) {            
            this.feeds.add(feed);
        }
    }

    /**
     * Leiratkozik egy csatornáról
     *
     * @param feed A feed, amit törölni akarunk
     */
    public void removeSubscription(RSSFeed feed) {
        this.feeds.remove(feed);
    }

    /**
     * Lekéri a feliratkozásoknak megfelelően Parse-olt feed-eket
     *
     * @return A feed-ek tömbje
     */
    public ArrayList<RSSFeed> getFeeds() {
        return this.feeds;
    }
    
    /**
     * Cím alapján visszadja a keresett feed-et
     * 
     * @param title
     * @return A keresett feed, vagy null
     */
    public RSSFeed getFeed(String title){
       for (RSSFeed feed : this.feeds){
           if (title.equals(feed.getTitle()))
               return feed;
       }
       return null;
    }
    
    /**
     * Frissíti a feliratkozott összes feed-et
     * 
     * @throws Ha hiba történt a frisstés során
     */
    public void refreshAllFeeds() throws IOException {
        for (RSSFeed feed : this.feeds) {
            this.refreshFeed(feed);
        }
    }
    
    /**
     * Frissít egy megadott feed-et
     * 
     * @param feed A frissíteni kívánt feed
     * @throws Ha hiba tortént a frissítés során
     */
    public void refreshFeed(RSSFeed feed) throws IOException {
        RSSParser.parseRSSFeedFromURL(feed);
    }

    /**
     * Lekérdező függvény
     * 
     * @param characters A keresési kulcsszó
     * @return A megfelelő feed-ek tömbje
     */
    @Override
    public ArrayList<RSSFeed> getFeedsFor(String characters) {
        ArrayList<RSSFeed> matches = new ArrayList<RSSFeed>();
        for (RSSFeed feed : this.feeds) {
            if (feed.getTitle().contains(characters)) {
                matches.add(feed);
            }
        }
        return matches;
    }
}
